home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / CBGRX103.ZIP / contrib / libgrx / src / patfline.c < prev    next >
Text File  |  1993-12-06  |  3KB  |  110 lines

  1. /**
  2.  ** PATFLINE.C
  3.  **
  4.  **  Copyright (C) 1992, Csaba Biegl
  5.  **    820 Stirrup Dr, Nashville, TN, 37221
  6.  **    csaba@vuse.vanderbilt.edu
  7.  **
  8.  **  This file is distributed under the terms listed in the document
  9.  **  "copying.cb", available from the author at the address above.
  10.  **  A copy of "copying.cb" should accompany this file; if not, a copy
  11.  **  should be available from where this file was obtained.  This file
  12.  **  may not be distributed without a verbatim copy of "copying.cb".
  13.  **  You should also have received a copy of the GNU General Public
  14.  **  License along with this program (it is in the file "copying");
  15.  **  if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  16.  **  Cambridge, MA 02139, USA.
  17.  **
  18.  **  This program is distributed in the hope that it will be useful,
  19.  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  **  GNU General Public License for more details.
  22.  **/
  23.  
  24. #include "grx.h"
  25. #include "libgrx.h"
  26. #include "lineclip.h"
  27.  
  28. void GrPatternFilledLine(int x1,int y1,int x2,int y2,GrPattern *p)
  29. {
  30.     union { GC *c; unsigned char *b; } src;
  31.     int dx,dy,sy,ymajor;
  32.     int pw,ph,px,py;
  33.     int ispixmap,fgc,bgc;
  34.     int points,error;
  35.     MOUSE_FLAG;
  36.  
  37.     if(y1 == y2) {
  38.         CLIPHLINE(CURC,x1,x2,y1);
  39.         MOUSE_BLOCK(CURC,x1,y1,x2,y1);
  40.         _GrFillPattern(x1,y1,(x2 - x1 + 1),p);
  41.         MOUSE_UNBLOCK();
  42.         return;
  43.     }
  44.     if(x1 == x2) {
  45.         CLIPVLINE(CURC,x1,y1,y2);
  46.     }
  47.     else {
  48.         CLIPLINE(CURC,x1,y1,x2,y2);
  49.     }
  50.     dx = x2 - x1;
  51.     dy = y2 - y1;
  52.     if(dy >= 0) {
  53.         MOUSE_BLOCK(CURC,x1,y1,x2,y2);
  54.         sy = 1;
  55.     }
  56.     else {
  57.         MOUSE_BLOCK(CURC,x1,y2,x2,y1);
  58.         dy = (-dy);
  59.         sy = (-1);
  60.     }
  61.     if((ispixmap = p->gp_ispixmap) != FALSE) {
  62.         pw = p->gp_pxp_width;
  63.         ph = p->gp_pxp_height;
  64.         px = (x1 + CURC->gc_xoffset) % pw;
  65.         py = (y1 + CURC->gc_yoffset) % ph;
  66.         src.c = (GC *)(&p->gp_pxp_source);
  67.     }
  68.     else {
  69.         pw = 8;
  70.         ph = p->gp_bmp_height;
  71.         px = (x1 + CURC->gc_xoffset) & 7;
  72.         py = (y1 + CURC->gc_yoffset) % ph;
  73.         src.b = p->gp_bmp_data;
  74.         fgc = p->gp_bmp_fgcolor;
  75.         bgc = p->gp_bmp_bgcolor;
  76.     }
  77.     if(dy > dx) {
  78.         points = dy + 1;
  79.         error  = dy >> 1;
  80.         ymajor = TRUE;
  81.     }
  82.     else {
  83.         points = dx + 1;
  84.         error  = dx >> 1;
  85.         ymajor = FALSE;
  86.     }
  87.     while(--points >= 0) {
  88.         _GrSetPixel(PIXEL_ADDR(x1,y1),
  89.         ispixmap ?
  90.             _GrReadPixel(src.c,PIX_ADDR(src.c,px,py)) :
  91.             (src.b[py] & (0x80U >> px)) ? fgc : bgc
  92.         );
  93.         if(ymajor) {
  94.         if((error -= dx) < 0) error += dy,x1++,px++;
  95.         y1 += sy,py += sy;
  96.         }
  97.         else {
  98.         if((error -= dy) < 0) error += dx,y1 += sy,py += sy;
  99.         x1++,px++;
  100.         }
  101.         if((unsigned)py >= (unsigned)ph) {
  102.         if(py < 0) py += ph;
  103.         else       py -= ph;
  104.         }
  105.         if(px >= pw) px = 0;
  106.     }
  107.     MOUSE_UNBLOCK();
  108. }
  109.  
  110.